package com.hodge.core.base;

import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.hodge.core.group.Insert;
import com.hodge.core.group.Update;
import com.hodge.core.result.Result;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.validation.annotation.Validated;
import org.springframework.web.bind.annotation.*;

import java.io.Serializable;
import java.util.Set;

/**
 * 基础控制器
 *
 * @author haojun
 * @since 2020/5/27 11:31
 */
public abstract class BaseController<S extends IService<E>, E> {
    /**
     * 注入服务
     * <p>
     * required = false 不提前注入，防止 IDEA 报红
     */
    @Autowired(required = false)
    public S service;

    /**
     * 分页查询列表
     *
     * @param index  当前页
     * @param size   页大小
     * @param entity 查询实体
     * @return 所有数据
     */
    @GetMapping("page/{index}/{size}")
    public Result selectAll(@RequestBody(required = false) E entity, @PathVariable Long index, @PathVariable Long size) {
        Page<E> page = new Page<>(index, size);
        return Result.withData(service.page(page, new QueryWrapper<>(entity)));
    }

    /**
     * 不分页查询列表
     *
     * @param entity 实体对象
     * @return 查询结果
     */
    @GetMapping("list")
    public Result list(@RequestBody(required = false) E entity) {
        return Result.withData(service.list(new QueryWrapper<>(entity)));
    }

    /**
     * 通过主键查询单条数据
     *
     * @param id 主键
     * @return 单条数据
     */
    @GetMapping("{id}")
    public Result selectOne(@PathVariable Serializable id) {
        return Result.withData(service.getById(id));
    }

    /**
     * 新增单条数据
     *
     * @param entity 实体对象
     * @return 新增结果
     */
    @PostMapping
    public Result insert(@RequestBody @Validated(Insert.class) E entity) {
        service.save(entity);
        return Result.success();
    }

    /**
     * 修改单条数据
     *
     * @param entity 实体对象
     * @return 修改结果
     */
    @PutMapping
    public Result update(@RequestBody @Validated(Update.class) E entity) {
        service.updateById(entity);
        return Result.success();
    }

    /**
     * 删除单条数据
     *
     * @param id 主键
     * @return 操作结果
     */
    @DeleteMapping("{id}")
    public Result delete(@PathVariable Long id) {
        service.removeById(id);
        return Result.success();
    }

    /**
     * 批量删除数据
     *
     * @param ids 主键集合
     * @return 操作结果
     */
    @DeleteMapping
    public Result deleteByIds(@RequestBody Set<Long> ids) {
        service.removeByIds(ids);
        return Result.success();
    }

}
